package com.jeesite.modules.sd.common.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import javax.print.*;
import javax.print.attribute.Attribute;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import java.awt.print.PrinterJob;
import java.io.InputStream;
import java.util.Objects;

/**
 * 打印文件工具类
 *
 * @author boya
 */
@Slf4j
public class PrintUtil {

    /**
     * 打印照片
     *
     * @param textStream 文件输入流
     * @param attribute  MediaSizeName（设置纸张大小，如：MediaSizeName.ISO_A8）
     * @param flavor  打印格式 ex:DocFlavor.INPUT_STREAM.PNG
     * @param printerName  打印机名称
     * @throws PrintException 打印机相关异常
     */
    public static void print(InputStream textStream,
                             Attribute attribute,
                             DocFlavor flavor,
                             String printerName) throws PrintException {
        // 当打印内容不为空时
        if (textStream != null) {
            //通过参数中配置的条码打印机名称获取打印机
            PrintService printService = getPrinterByName(printerName);
            if(Objects.isNull(printService)){
                throw new PrintException("未连接到打印机!");
            }

            // 创建打印作业
            DocPrintJob job = printService.createPrintJob();
            // 设置打印属性
            PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
            printRequestAttributeSet.add(attribute);

            // 指定打印内容
            Doc doc = new SimpleDoc(textStream, flavor, new HashDocAttributeSet());
            // 进行每一页的具体打印操作
            job.print(doc, printRequestAttributeSet);
        } else {
            // 如果打印内容为空时，提示用户打印将取消
            throw new RuntimeException("打印内容为空,请检查文件...");
        }
    }

    /**
     * 通过打印机名称获取打印机服务
     *
     * @param printerName 打印机名称
     * @return PrintService
     * @author 湛承俊
     * @date 2020 -08-07 09:57:18
     */
    public static PrintService getPrinterByName(String printerName){
        //获得本台电脑连接的所有打印机
        PrintService[] printServices = PrinterJob.lookupPrintServices();
        for (PrintService service :printServices ) {
            if (StringUtils.containsIgnoreCase(service.getName(), printerName)) {
                return service;
            }
//            if (service.getName().contains(printerName)) {
//                return service;
//            }
        }
        return null;
    }
}
